//
//  main.m
//  C03- 循环结构
//
//  Created by dllo on 15/11/19.
//  Copyright © 2015年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
//    @autoreleasepool {
//        // insert code here...
//        NSLog(@"Hello, World!");
//    }
    
#pragma mark 知识点1 for循环
    {
#if 0
        for (<#initialization#>/*变量初始化*/; <#condition#>/*条件表达式*/; <#increment#>/*变量的增量*/) {
            <#statements#>/*循环体语句*/
        }
        流程:
        1. 变量初始化
        2. 判断条件表达式(真\假)
        3. 如果条件表达式为真,执行循环体语句
        4. 执行变量增量
        5. 再次判断条件表达式(真\假)
        6. 如果此时表达式为假,退出整个循环.
        
#endif
        
    }
#pragma mark 课堂练习
    {        /**
              * 练习1: 打印5次"hello, lanou!"
              */
#if 0
        for (int i = 0; i<5; i++) {
            printf("Hello Lanou!\n");
        }
#endif
        
        /*练习2 正序打印1-5*/
#if 0
        for (int i = 0; i < 5; i++) {
            printf("%d\n", i + 1);
        }
        
        for (int i = 5; i > 0; i--) {
            printf("%d\n", i);
        }
#endif
#if 0
        /*for循环 打印1-100之间偶数*/
        for (int i = 0; i < 100; i++) {
            if ((i + 1 ) % 2 == 0) {
                printf("%d\n", i+1);
            }
        }
        
#endif
        /**
         * 练习4:
         * 用for循环打印出1~100之间7的倍数。
         * 用for循环打印出1~100之间个位为7的数。
         * 用for循环打印出1~100之间十位为7的数。
         * 用for循环打印出1~100之间既不是7的倍数并且也不包含7的数。
         
         提示:
         如何获取一个数a的个位?   a  % 10
         如何获取一个数a的十位?   a   /  10
         */
#if 0
        for (int i = 0; i < 100; i ++) {
            if (i % 7 == 0) {
                printf("%d\n",i);
            }
        }
#endif
#if 0
        for (int i = 0; i < 100; i++) {
            if (i % 10 == 7) {
                printf("%d\n", i);
            }
        }
#endif
#if 0
        for (int i = 0; i < 100; i++) {
            if (i % 10 == 7) {
                /*十位为7*/
                printf(" %d", i);
            }
        }





#endif


#if 0
        for (int i = 0; i < 100; i++) {
            if ((i + 1) % 7 != 0 && (i +1) / 10 != 7 && (i +1) % 10 != 7){
                /*不能被7整除  十位不等于7 个位不等于7*/
                printf("%d\n", i + 1);
            }
        }
        
        
        
#endif
    }
#pragma mark 知识点2 break continue
    {
        /** 
         *break 跳出本层循环
         *continue 跳出本次循环
         */
        
        
    }

#pragma mark 课堂练习

    {
        /** break
         * 练习1: 判断一个数是否是质数
         *
         * 注: 任何一个数都能被1和它本身整除, 就看该数能否被2到本身-1的数整除即可. 如果能够整除,说明不是质数
         */
//
//        int number = 0;
//        BOOL isZhi = NO;
//        printf("请输入一个整数:");
//        scanf("%d", &number);
//        for (int i = 2; i < number; i++) {
//            /* 从2 开始除*/
//            if (number % i ==0) {
//                isZhi = NO;
//                break;/*break的作用是跳出本层循环*/
//            } else {
//                isZhi = YES;
//            }
//            
//        }
//        if (isZhi == YES) {
//            printf("是质数\n");
//        } else {
//            printf("不是质数\n");
//        }
//        
//        printf("over\n");

    }

#pragma mark 知识点3 随机数
    {
        /**
         * 公式 : arc4Random() % (b - a + 1) + a
         */
    }
#pragma mark 课堂练习
    /*练习1*/
    {
#if 0
        /**
        * 练习1  用for打印10个随机数(范围为10~30), 求最大值和最小值.
        */
        int max = 0;
        int min = 30;
        int random = 0;
        for (int i = 0; i < 10; i++) {
            random = arc4random() % (30 - 10 + 1) + 10;
            printf("%4d", random);
            

            /* 和最大值比较*/
            if (random > max) {
                max = random;
            }
            /* 和最小值比较*/
            if (random < min) {
                min = random;
            }
     }
        printf("\n");
        /* 10次循环之后 输出最终结果*/
        printf("max = %d, min = %d\n", max, min);
#endif
        /**
         * 练习1: 打印一行 1, 2, 3, 4, 5
         */
#if 0
        for (int i = 0; i < 5; i ++) {
            printf("%d", (i + 1));
        }
        printf(" \n");
#endif
        
        
        /**
         * 练习2: 打印三行 1, 2, 3, 4, 5
         */   /* 确定行数 3行*/
#if 0
        for (int i = 0; i < 3; i++) {
            /* 循环体内相当于每行的输出*/
            for (int j = 0; j < 5; j++) {
                printf("%d",j + 1);
            }
            /* 每行结束之后加一个换行符*/
            printf("\n");
        }
#endif
        /**
         * 练习3: 打印如下图形：
         1
         1 2
         1 2 3
         1 2 3 4
         1 2 3 4 5
         */
#if 0
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < i + 1; j++) {
                printf("%d ", j+1);
            } printf("\n");
        }
        
#endif
        /**
         * 练习4: 打印如下图形：
         1 2 3 4 5
         1 2 3 4
         1 2 3
         1 2
         1
         */
#if 0
        for (int i = 0; i < 5; i++) {
            for (int j =0;  j <5 - i ; j++) {
                printf(" %d", j + 1);
            }printf("\n");
        }
#endif
        /*练习5 9*9 乘法表*/
#if 0
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < i + 1; j++) {
                
                printf("%d*%d=%-2d ", j + 1 , i + 1, (j + 1) * (i + 1));
                
            }
            printf("\n");
        }
#endif
        /** 练习6 打印三个数字(0-9) 的组合可能*/
#if 0
        for (int i = 1; i < 10; i++ ) {
            for (int j = 0; j < 10; j++) {
                for (int m = 0; m < 10; m++) {
                    printf("%d%d%d ",i, j, m);
                }
                printf("\n");
            }
            
        }
#endif
     }
    
#pragma mark 知识点4 while循环
    
    {
#if 0
        while (<#condition#>/*条件表达式*/) {
            <#statements#>/*语句*/
        }
        流程 :
        1. 判断条件表达式
        2. 如果表达式结果为真,执行语句.
        3. 再次判断条件表达式
        
#endif
    }
    
#pragma mark 课堂练习
    {
    /**
      * 练习1:
      * 用while循环打印出1~100之间7的倍数。
      * 用while循环打印出1~100之间个位为7的数。
      * 用while循环打印出1~100之间十位为7的数。
      * 用while循环打印出1~100之间既不是7的倍数并且也不包含7的数。
      */
#if 0
        int i = 1;
        while (i <= 100) {
            if (i % 7 == 0) {
                printf("%d\n", i);
            }
            i++;
        }
#endif

#if 0
        int i = 0;
        while (i <= 100) {
            if ((i+1)  % 10 == 7) {
                printf("%d\n", i+1);
            }
            i ++;
        }
#endif
        
#if 0
        int m = 0;
        while (m < 100) {
            if ((m  + 1) / 10 == 7) {
                printf("%d\n", m + 1);
            }
            m++;
        }
#endif
        
#if 0
        /* 练习2 无限循环 */
        int number = 0;
        while (1) {
            
            printf("输入一个数(输入0退出程序):");
            scanf("%d", &number);
            if (0 == number) {
                break/*跳出循环*/;/*return 退出主函数,程序结束*/
            }
            printf("刚才输入的整数是:%d", number);
            
        }
        
        printf("跳出循环,继续执行代码\n");
        
#endif
        /* 练习3 输入一个整数 判断是否为质数 打印出来 当输入0时 退出程序*/
//#if 0
//        
//        
//        int Number = 0;
//        BOOL Zhi = NO;
//        while (1) {
//            printf("请输入一个整数(输入0时退出程序):");
//            scanf("%d", &Number);
//            for (int i = 2; i < Number; i++) {
//                if (Number % i == 0) {
//                    Zhi = NO;
//                break;/* 跳出 for循环  但是不跳出while循环*/
//            } else {
//                Zhi = YES;
//            }
//        }
//        if (Zhi == YES) {
//            printf("是质数\n");
//        } else {
//            printf("不是质数\n");
//        }
//        printf("over\n");
//        
//#endif
        }
#pragma mark 知识点5 do....while 循环
    
    {
        /* do {
         语句
         }while (条件表达式)
         */
        
    }
 
#pragma mark 课堂练习
    
    {
        /*输入一个整数 求这个整数的位数*/
#if 0
        int count=0;
        int number=0;
        printf("输入一个整数:");
        scanf("%d", &number);
        do {
            count++;
        } while (number/=10);
        printf("位数是:%d\n", count);
#endif
    }
    
        return 0;
    }